import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;

public class Test152 {
    public static void main(String[] args) {

    }


    public int maxProduct(int[] nums) {
        int maxValue = nums[0];
        int minValue = nums[0];
        int ans = nums[0];
        for (int i = 1; i < nums.length; i++) {
            maxValue = Math.max(maxValue*nums[i],Math.max(nums[i],minValue*nums[i]));
            minValue = Math.min(minValue*nums[i],Math.min(nums[i],maxValue*nums[i]));
            ans = Math.max(ans,maxValue);
        }
        return ans;
    }

//    /**
//     * 思路1：计算出每个负数段之间的值，遇到0，计算0前面段的最大值。最后计算总的最大值
//     * @param nums
//     * @return
//     */
//    public int maxProduct(int[] nums) {
//        int maxValue = nums[0];
//        int temp = nums[0];
//        ArrayList<Integer> list = new ArrayList<>();
//        int[] dp = new int[nums.length];
//        dp[0] = nums[0];
//        for (int i = 1; i < nums.length; i++) {
//            dp[i]=temp*nums[i];
//            if(nums[i]==0){
//                maxValue=Math.max(helper(list),maxValue);
//                temp = 1;
//            }else if(nums[i]<0){
//                list.add(nums[i]);
//                temp = 1;
//            }else {
//                temp=dp[i];
//            }
//            if(list.size()!=0){
//                return maxValue=Math.max(helper(list),maxValue);
//            }
//        }
//        return dp[nums.length-1];
//    }
//
//    public int helper(ArrayList<Integer> list){
//        if(list.size()==0){
//            return 0;
//        }
//        int temp = 1;
//        for (int i: list) {
//            temp=temp*i;
//        }
//        if(list.size()%2==0){
//            list.clear();
//            return temp;
//        }else {
//            list.clear();
//            return Math.max(temp/list.get(0),temp/list.get(list.size()-1);
//        }
//    }

//    public int maxProduct(int[] nums) {
//        int left = 1;
//        int[] dp = new int[nums.length+2];
//        dp[0] = dp[nums.length+1] = 1;
//        int right = nums.length-1;
//        while (left<=nums.length-1&&nums[left]>0){
//            dp[left+1]=dp[left]*nums[left];
//            left++;
//        }
//        if(left== nums.length-1){
//            return dp[left+1];
//        }
//        dp[left+1]=dp[left]*nums[left];
//
//        while (left<=right&&nums[right]>0){
//            dp[right+1]=nums[right]*dp[right+2];
//            right--;
//        }
//        if(left==right)
//            return Math.max(dp[left],dp[right]);
//        dp[right+1]=nums[right]*dp[right+2];
//    }

}
